package Game;

import java.awt.Rectangle;

import javax.swing.ImageIcon;


/**
 * Clase abstracta Robot que extiende de Thread.
*/

public abstract class Robot extends Thread  {

	protected RepresentacionGrafica componente;
	protected int combustible;
	protected int puntajeNivel;
	protected int posX;
	protected int combMax;
	protected int posY;
	protected Baul baul;
	protected Pincel pincel;
	protected Tablero tablero;
	protected Brazo braz;
	protected int horizonte;
	protected ImageIcon[] cara;


	/**
	 * Constructor de un robot que inicializa sus atributos combustible actual, puntaje,
	 * posicion en el tablero del juego y capacidad de combustible maxima.
	 */
	public Robot(int comb, int pun, int combM) {
		combustible = comb;
		combMax = combM;
		puntajeNivel = pun;
		pincel= new Pincel ();
		baul=new Baul();
		this.horizonte=2;
		braz= new Brazo(this);
		
	}
	
	/**
	 * Setea el tablero donde se desarrolla el juego.
	 * @param t tablero
	 */
	public void setTablero (Tablero t){
		tablero=t;
	}
	
	
	/**
	 * Setea la posicion de la cordenada Y del robot
	 * @param i posicion de la cordenada Y
	 */
	public void setPosY(int i){
		posY=i;
		componente.setPos(posX, i);
		
	}
	
	/**
	 * Setea la posicion de la cordenada X del robot
	 * @param i posicion de la cordenada X
	 */
	public void setPosX ( int i){
		posX=i;
		componente.setPos(i, posY);
	}
	
	/**
	 * Descarga el coleccionable en la posicion indicada por los argumentos recibido en el tablero t
	 * @param t tablero donde se va a descargar el coleccionable.
	 * @param x posicion de la cordenada x
	 * @param y posicion de la cordenada y
	 */
	public Coleccionable Descargar(Tablero t, int x, int y) {
		return null;
	
	}
	
	/**
	 * Desplega el pincel para luego pintar
	 */
	public void desplegarPincel() {
	
	}
	
	/**
	 * Guarda el pincel para no seguir pintando
	 */
	
	public void guardarPincel() {
	
	}
	
	/**
	 * Cambia de color el pincel, si estaba en negro pasa a blanco sino al reves.
	 */
	public void cambiarColor() {
	
	}
	
	/**
	 * Obtiene la posicion de la cordenada x
	 * @return posx posicion de la cordenada x
	 */
	public int getPosX() {
		return posX;
	
	}
	/**
	 * Obtiene la posicion de la cordenada y
	 * @return posy posicion de la cordenada y
	 */
	public int getPosY() {
		return posY;
	
	}
	
	/**
	 * Obtiene el combustible que tiene disponible el robot
	 * @return combustible disponible
	 */
	public int getCombustible() {
		return combustible;
	
	}
	
	/**
	 * Consume una unidad de combustible
	 */
	public void consumirComb(){
		combustible--;
	}
	
	/**
	 * Obtiene el puntaje del nivel 
	 * @return puntajeNivel del juego
	 */
	public int getPuntajeNivel() {
		return puntajeNivel;
	
	}
	
	/**
	 * Obtiene el baul que contiene los coleccionables que halla juntado el robot
	 * @return baul de objetos coleccionables
	 */
	public Baul getBaul() {
		return baul;
	
	}
	
	/**
	 * Obtiene el pincel
	 * @return pincel del robot
	 */
	public Pincel getPincel() {
		return pincel;
	
	}
	
	/**
	 * Obtiene el brazo del robot
	 * @return braz brazo del robot
	 */
	public Brazo getBrazo(){
		return braz;
	}
	
	/**
	 * Almacena el premio recibido por parametro.
	 * @param premio a juntar
	 */
	public void juntarPremio(Premio premio) {
	
	}
	
	/**
	 * Setea la representacion grafica recibido por parametro
	 * @param rp representacion grafica
	 */
	public void setRepresentacionG(RepresentacionGrafica rp){
		componente =rp;
	}
	
	/**
	 * Obtiene la representacion grafica
	 * @return componente
	 */
	public RepresentacionGrafica getRepresentacionG(){
		return componente;
	}
	
	
	public Rectangle getBounds() {
		return new Rectangle(posX, posY, 50, 50);
	}
	
	/**
	 * Pregunta si se colisionan el robot con el objeto
	 * @return true si se intersectan los objetos, false en caso contrario.
	 * @param  o objeto para verificar si hubo colision
	 */
	public boolean collision(Objeto o) {
		return o.getBounds().intersects(getBounds()); 
	}
	

	// Le tengo que agregar un entero, 
	// le paso h de gui, para ver hacia donde mira.
	// y en base a eso modificar get bounds
	
	/**
	 * Pregunta si el brazo del robot colisiono con el objeto recibido por parametro
	 * @return true si se intersecta el brazo del robot con el objeto, false en caso contrario.
	 * @param  o objeto para verificar si hubo colision
	 */
	public boolean collisionBrazo(Objeto o) {

		return o.getBounds().intersects(braz.getBounds()); 
	}
	
	/**
	 * Pregunta si hubo colision del robot con un NoTransitable
	 * @return true si se intersecta el robot con un NoTransitable, false en caso contrario.
	 * @param p NoTransitable para verificar si hubo colision
	 */
	public boolean collision(NoTransitable p) {

		return p.getBounds().intersects(getBounds()); 
	}
	
	/**
	 * Pregunta si hubo colision del robot con un Transitable
	 * @return true si se intersecta el robot con un Transitable, false en caso contrario.
	 * @param  p Transitable para verificar si hubo colision
	 */
	public boolean collision(Transitable p) {

		return p.getBounds().intersects(getBounds()); 
	}
	
	public void run()
	{
		componente.setLocation(posX,posY);
		componente.setVisible(true);
	
	}
	
	public void setHorizonte (int h){
		horizonte = h;
		braz.setHorizonte(horizonte);
	}

	
	public void setPuntaje(int i) {
		puntajeNivel = i;
		
	}

	public void setCombustible(int i) {
		combustible=i;
		
	}
	

}
